<?php
/**
 * 予定データマッパークラスモジュール
 */
require_once APPLICATION_PATH . '/models/Schedule/Controller.php';
require_once 'Request/DateTime.php';
require_once 'DateMath.php';

/**
 * 予定データマッパークラス
 * Enter description here ...
 * @author admin
 *
 */
class Mapper_Schedule extends Models_Schedule_Xml_Controller
{
	/** リクエストキー： 年 */
	const KEY_YEAR ="year";
	/** リクエストキー： 月 */
	const KEY_MONTH ="month";
	/** リクエストキー： 日 */
	const KEY_DAY ="day";
	/** リクエストキー： ＩＤ */
	const KEY_ID ="id";
	/** リクエストキー： 年齢 */
	const KEY_AGE ="AGE";
	/** リクエストキー： 試合有無フラグ */
	const KEY_GEX ="gex";
	/** リクエストキー： 集合時刻（時） */
	const KEY_COLLECT_HOUR ="collect_Hour";
	/** リクエストキー： 集合時刻（分） */
	const KEY_COLLECT_MINUTE ="collect_Minute";
	/** リクエストキー： 解散時刻（時） */
	const KEY_BREAK_HOUR ="break_Hour";
	/** リクエストキー： 解散時刻（分） */
	const KEY_BREAK_MINUTE ="break_Minute";
	/** リクエストキー： 地図ＩＤ */
	const KEY_MAPID ="mapid";

	/** オブジェクト状態 */
	protected $_bObjectCondition = TRUE;
	/** リクエストオブジェクト */
	protected $_objRequest;

	/**
	 * コンストラクタ
	 * Enter description here ...
	 * @param  $YYYYMM
	 */
	public function __construct($YYYYMM='')
	{
		$this->_objRequest = new Lib_Request_DateTime();
		if ( $YYYYMM == '' ) {
			if ( isset($_REQUEST[Lib_Request_DateTime::KEY_YMD])) {
				$sResult = $this->_objRequest->getYearMonthDay();
				$YYYYMM = substr($sResult, 0, strlen('YYYYMM'));
			} else {
				$sResult = self::createYYYYMM();
				if ( $sResult === FALSE ) {
					$this->_bObjectCondition = FALSE;
					return ;
				}
				$YYYYMM = $sResult;
			}
		}
		$sXmlFileName = $YYYYMM . '.xml';

		/**
		 * 新規データファイルクリエイト
		 */
		$strFileName = $this->getDefaultSavePath() . $sXmlFileName;
		if ( !file_exists($strFileName)) {
			$this->_aryXml['LIST'][] = array();
			$this->saveToFile($strFileName);
		}

		parent::__construct($sXmlFileName);
	}

	/**
	 * ＨＴＴＴＰリクエスト（年：月）からYYYYMMを差ｋすえいする
	 * Enter description here ...
	 */
	public static function createYYYYMM()
	{
		/***
		 * 必須・論理チェック
		 */
		if ( !isset($_REQUEST[Lib_Request_DateTime::KEY_YEAR]) ) {
			return FALSE;
		}
		if  ( !isset($_REQUEST[Lib_Request_DateTime::KEY_MONTH])) {
			return FALSE;
		}
		if ( !is_numeric($_REQUEST[Lib_Request_DateTime::KEY_YEAR]) ){
			return FALSE;
		}
		if ( !is_numeric($_REQUEST[Lib_Request_DateTime::KEY_MONTH]) ){
			return FALSE;
		}
		if ( $_REQUEST[Lib_Request_DateTime::KEY_MONTH] < 1 ) {
			return FALSE;
		}
		if ( $_REQUEST[Lib_Request_DateTime::KEY_MONTH] > 12) {
			return FALSE;
		}

		$sMonth = sprintf('%02d', $_REQUEST[Lib_Request_DateTime::KEY_MONTH]);
		$sResult = $_REQUEST[Lib_Request_DateTime::KEY_YEAR] . $sMonth;

		return $sResult;
	}

	/**
	 * HTTPリクエストからスケジュールデータを更新する
	 * Enter description here ...
	 */
	public function putFromHttpRequest()
	{
		if ( $this->_bObjectCondition === FALSE ) {
			return FALSE;
		}

		$iYear = $this->_objRequest->getYear();
		$iMonth	= $this->_objRequest->getMonth();
		$iDay	= $this->_objRequest->getDay();
		$iHour	= $this->_objRequest->get(self::KEY_COLLECT_HOUR);
		$iMinute	= $this->_objRequest->get(self::KEY_COLLECT_MINUTE);
		$iHours	= $this->getUt();
		$strPlace	= $this->_objRequest->get(Mapper_Place::KEY_MAPID);
		$strKind	= self::getKind();
		$aryAges = $this->_objRequest->get(self::KEY_AGE);
		$strAge	= implode(',', $aryAges);
		$strStopFlg = $this->_objRequest->get(self::KEY_STOPFLG);
		$strInfo = $this->_objRequest->get(self::KEY_INFO);

		$this->putData($iYear, $iMonth, $iDay, $iHour, $iMinute, $iHours, $strPlace, $strKind, $strAge, '', $strStopFlg, $strInfo);
		$this->saveToFile();
	}

	/**
	 * 練習時間ＵＮＩＸたいむで求める
	 * Enter description here ...
	 */
	public function getUt()
	{
		$utCollect = mktime(
			$this->_objRequest->get(self::KEY_COLLECT_HOUR),
			$this->_objRequest->get(self::KEY_COLLECT_MINUTE),
			0,
			$this->_objRequest->getMonth(),
			$this->_objRequest->getDay(),
			$this->_objRequest->getYear()
		);
		$utBreak = mktime(
			$this->_objRequest->get(self::KEY_BREAK_HOUR),
			$this->_objRequest->get(self::KEY_BREAK_MINUTE),
			0,
			$this->_objRequest->getMonth(),
			$this->_objRequest->getDay(),
			$this->_objRequest->getYear()
		);

		$utResult = $utBreak - $utCollect;
		return $utResult;
	}

	/**
	* ＨＴＴＰリクエストバリデーション判定
	* Enter description here ...
	*/
	public static  function validHttpRequest()
	{
		if (!isset($_REQUEST[Components_ScheduleEdit::KEY_YEAR])) {
			return FALSE;
		}
		if (!isset($_REQUEST[Components_ScheduleEdit::KEY_MONTH])) {
			return FALSE;
		}

		return TRUE;
	}

	/**
	 * 集合種別をＨＴＴＰリクエストから判定して返す
	 * Enter description here ...
	 */
	public static function getKind()
	{
		$sResult = 'train';
		$objRequest = new Lib_Request();
		$bGameExists = $objRequest->get(self::KEY_GEX);
		if ( $bGameExists[0] === '1' ) {
			$sResult = 'game';
		}
		return $sResult;
	}
}